home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / SWAG / SWAGA_C / COMM.SWG / 0016_Detect 16550A UART.pas < prev    next >
Pascal/Delphi Source File  |  1993-07-16  |  3KB  |  114 lines

  1. {
  2. From: Kai_Henningsen@ms.maus.de (Kai Henningsen)
  3. Newsgroups: comp.dcom.modems
  4. Subject: Help upgrade to 16550A
  5. Date: Tue, 04 Aug 92 16:13:00 GMT
  6. Organization: MausNet
  7.  
  8. Any noncommercial use allowed. For commercial, ask me - or use something
  9. else. The ideas in this program are really very simple ... I seem to
  10. remember most came from an article in DDJ.
  11. }
  12.  
  13. program ShowUARTs;
  14.  
  15. uses
  16.   m7UtilLo;
  17.  
  18. type
  19.   tUART           = (uNoUART, uBadUART, u8250, u16450, u16550, u16550a);
  20.  
  21. const
  22.   MCR             = 4;
  23.   MSR             = 6;
  24.   Scratch         = 7;
  25.   FCR             = 2;
  26.   IIR             = 2;
  27.   LOOPBIT         = $10;
  28.  
  29. function UARTat(UART: Word): tUART;
  30. var
  31.   HoldMCR,
  32.   HoldMSR,
  33.   Holder          : Byte;
  34. begin {|UARTat}
  35.   HoldMCR := Port[UART + MCR];
  36.   Port[UART + MCR] := HoldMCR or LOOPBIT;
  37.   HoldMSR := Port[UART + MSR];
  38.   Port[UART + MCR] := $0A or LOOPBIT;
  39.   Holder := Port[UART + MSR] and $F0;
  40.   Port[UART + MSR] := HoldMSR;
  41.   Port[UART + MCR] := HoldMCR and not LOOPBIT;
  42.   if Holder <> $90 then begin
  43.     UARTat := uNoUART;
  44.     Exit
  45.   end {|if Holder<>$90};
  46.   Port[UART + Scratch] := $AA;
  47.   if Port[UART + Scratch] <> $AA then
  48.     UARTat := u8250
  49.   else begin
  50.     Port[UART + FCR] := $01;
  51.     Holder := Port[UART + IIR] and $C0;
  52.     case Holder of
  53.       $C0: UARTat := u16550a;
  54.       $80: UARTat := u16550;
  55.       $00: UARTat := u16450;
  56.       else UARTat := uBadUART;
  57.     end {|case Holder};
  58.     Port[UART + FCR] := $00;
  59.   end {|if Port[UART+Scratch]<>$AA else};
  60. end {|UARTat};
  61.  
  62. procedure DisplayUARTat(UART: Word; name: string; num: Integer);
  63. begin {|DisplayUARTat}
  64.   Write(Hex(UART, 4), ' ', name, num);
  65.   if UART = 0 then
  66.     Writeln(' not defined')
  67.   else
  68.     case UARTat(UART) of
  69.       uNoUART: Writeln(' not present');
  70.       uBadUART: Writeln(' broken');
  71.       u8250: Writeln(' 8250B');
  72.       u16450: Writeln(' 16450');
  73.       u16550: Writeln(' 16550');
  74.       u16550a: Writeln(' 16550A');
  75.       else Writeln(' unknown');
  76.     end {|case UARTat(UART)};
  77. end {|DisplayUARTat};
  78.  
  79. var
  80.   i               : Integer;
  81.   BIOSPortTab     : array [1 .. 4] of Word absolute $40: 0;
  82. begin {|ShowUARTs}
  83.   Writeln; Writeln;
  84.   Writeln('COM Port Detector');
  85.   Writeln;
  86.   for i := 1 to 4 do
  87.     DisplayUARTat($02E8 + $100 * (i and 1) + $10 * Ord(i < 3), 'Standard COM',
  88.         i);
  89.   Writeln;
  90.   for i := 3 to 8 do
  91.     DisplayUARTat($3220 + $1000 * ((i - 3) div 2) + $8 * Ord(not Odd(i)),
  92.         'PS/2 COM', i);
  93.   Writeln;
  94.   for i := 1 to 4 do
  95.     DisplayUARTat(BIOSPortTab[i], 'BIOS COM', i);
  96. end {|ShowUARTs}.
  97.  
  98. m7utillo is a general utility unit I use a lot; all you need is this routine:
  99.  
  100. function Hex(v: Longint; w: Integer): String;
  101. var
  102.   s               : String;
  103.   i               : Integer;
  104. const
  105.   hexc            : array [0 .. 15] of Char= '0123456789abcdef';
  106. begin
  107.   s[0] := Chr(w);
  108.   for i := w downto 1 do begin
  109.     s[i] := hexc[v and $F];
  110.     v := v shr 4
  111.   end;
  112.   Hex := s;
  113. end {Hex};
  114.